package com.yunxi.module.system.service.tenant;

import com.yunxi.framework.common.pojo.PageResult;
import com.yunxi.module.system.model.tenant.TenantDO;
import com.yunxi.module.system.service.tenant.handler.TenantInfoHandler;
import com.yunxi.module.system.service.tenant.handler.TenantMenuHandler;
import com.yunxi.module.system.vo.admin.tenant.tenant.TenantPageReqVO;
import com.yunxi.module.system.vo.admin.tenant.tenant.TenantSaveReqVO;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 租户 Service 接口
 * </p>
 *
 * @author lidy
 * @since 2024-05-08
 */
public interface TenantService {

    /**
     * 获得名字对应的租户
     *
     * @param name 租户名
     * @return 租户
     */
    TenantDO getTenantByName(String name);

    /**
     * 获得所有租户编号
     *
     * @return 租户编号集合
     */
    List<Long> getTenantIdList();

    /**
     * 校验租户是否合法
     *
     * @param tenantId 租户编号
     */
    void validTenant(Long tenantId);

    /**
     * 根据租户编号查询租户信息
     *
     * @param tenantId 租户编号
     * @return 租户信息
     */
    TenantDO getTenant(Long tenantId);

    /**
     * 进行租户的信息处理逻辑
     * 其中：租户编号从 {@link com.yunxi.framework.tenant.core.context.TenantContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleTenantInfo(TenantInfoHandler handler);

    /**
     * 租户的菜单逻辑过来
     * 其中：租户编号从 {@link com.yunxi.framework.tenant.core.context.TenantContextHolder} 上下文中获取
     *
     * @param handler 过滤器
     */
    void handleTenantMenu(TenantMenuHandler handler);

    /**
     * 获得租户分页列表
     *
     * @param reqVO 条件
     * @return 租户分页列表
     */
    PageResult<TenantDO> getTenantPage(TenantPageReqVO reqVO);

    /**
     * 创建租户
     *
     * @param createReqVO 租户信息
     * @return 租户编号
     */
    Long createTenant(TenantSaveReqVO createReqVO);

    /**
     * 更新租户信息
     *
     * @param updateReqVO 租户信息
     */
    void updateTenant(TenantSaveReqVO updateReqVO);

    /**
     * 更新租户的角色菜单
     *
     * @param tenantId 租户编号
     * @param menuIds  菜单编号数组
     */
    void updateTenantRoleMenu(Long tenantId, Set<Long> menuIds);

    /**
     * 删除租户
     *
     * @param tenantId 租户编号
     */
    void deleteTenant(Long tenantId);

    /**
     * 根据租户域名,获得租户信息
     *
     * @param website 租户域名
     * @return 租户信息
     */
    TenantDO getTenantByWebsite(String website);


    /**
     * 获得使用指定套餐的租户数组
     *
     * @param packageId 租户套餐编号
     * @return 租户数组
     */
    List<TenantDO> getTenantListByPackageId(Long packageId);

    /**
     * 根据租户套餐编号查询租户数量
     *
     * @param packageId 租户套餐编号
     * @return 租户数量
     */
    Long getTenantCountByPackageId(Long packageId);
}
